home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / PROBLEMS / BENCHMARK / BUBBLESORT / bubbletest / assembler / needed < prev    next >
Text File  |  1992-05-13  |  12KB  |  642 lines

  1. ; ****************************************************************************
  2. ; This file is freeware, you may copy it, but not modify and/or make money
  3. ; with it
  4. ; the contence is a conclusion of !formula.tlastatrel and !formula.functions
  5. ; formula is freeware
  6. ; it's publiced here for people, who don't have, don't want formula
  7. ; ****************************************************************************
  8.  
  9. stackregister .EQU R12 
  10.  
  11. tempregister .EQU R11
  12.  
  13. formulastackregistersave .EQU FALSE
  14.  
  15. formulatempregistersave .EQU FALSE
  16.  
  17. formulaflagsave .EQU FALSE
  18.  
  19. formulastacklength .EQU 256.
  20.  
  21. ; used macros following
  22.  
  23.  .MACRO LADR
  24. \adress
  25.   .IF \adress- %2 >65524.
  26.    MOV %1,#((\adress - %2 + 8 + 12.) & 0FF)
  27.    ADD %1,%1,#(((\adress - %2 + 8 + 12.) / 100) &0FF) << 8   
  28.    ADD %1,%1,#((\adress - %2 + 8 + 12.) / 10000) << 16.  
  29.   .ELSE
  30.    MOV %1,#((\adress - %2 + 8 + 8) & 0FF)
  31.    ADD %1,%1,#(((\adress - %2 + 8 + 8) / 100) &0FF) << 8 
  32.   .ENDC  
  33.   SUB %1,PC,%1
  34.  .ENDM
  35.  
  36.  .MACRO    ADDR
  37. \addr
  38.   .IF \addr- %2 >255.
  39.    LADR %1,%2
  40.   .ELSE
  41.    ADR %1,%2
  42.   .ENDC
  43.  .ENDM
  44.  
  45.  .MACRO    LD
  46. \load 
  47.   .IF \load- %2 >4084.
  48.    LADR %1,%2
  49.    LDR %1,[%1]
  50.   .ELSE
  51.    LDR %1,%2
  52.   .ENDC
  53.  .ENDM
  54.  
  55.  .MACRO    LDB
  56. \load 
  57.   .IF \load- %2 >4084.
  58.    LADR %1,%2
  59.    LDRB %1,[%1]
  60.   .ELSE
  61.    LDRB %1,%2
  62.   .ENDC
  63.  .ENDM
  64.  
  65.  .MACRO    ST
  66. \store
  67.   .IF \store- %2 >4084.
  68.    LADR tempregister,%2
  69.    STR %1,[tempregister]
  70.   .ELSE
  71.    STR %1,%2
  72.   .ENDC
  73.  .ENDM
  74.  
  75.  .MACRO    STB
  76. \store
  77.   .IF \store- %2 >4084.
  78.    LADR tempregister,%2
  79.    STRB %1,[tempregister]
  80.   .ELSE
  81.    STRB %1,%2
  82.   .ENDC
  83.  .ENDM
  84.  
  85.  .MACRO BACKADDR
  86.   LDR tempregister,\goadress
  87.   ADD %1,PC,tempregister
  88.   B \ready 
  89. \goadress .WORD %2-\goadress
  90. \ready
  91.  .ENDM
  92.   
  93.  .MACRO formuladata
  94. ; stackspace for the stack of formula 
  95. ; Invoke this only one time !!!! 
  96.  
  97.  B formulajump  
  98. formulatemp         .BLOCK formulastacklength,0 
  99.  .ALIGN
  100. formularegistersave .BLOCK 64.   
  101.  .ALIGN
  102. formulaclitail      .BLOCK 257.,0
  103.  .ALIGN
  104. formulamystackregistersave    .WORD  0
  105. formulajump 
  106.  
  107. formula_one .EQU 1
  108.  .ENDM
  109.  
  110. ; initialisation for formula, MUST be called before the first formulacommand 
  111. ; change values of stackregister and tempregister  
  112.  
  113.  .MACRO formulainit
  114.   LADR stackregister,formulatemp
  115.   LADR tempregister,formulamystackregistersave
  116.   STR  stackregister,[tempregister]
  117.   STR  stackregister,[stackregister,#4]
  118.  .ENDM
  119.  
  120.   formuladata
  121.   formulainit
  122.  
  123.  .NOLIST
  124.  
  125.  .MACRO    GO
  126.   B %1
  127.  .ENDM
  128.  
  129.  .MACRO    GOLINK
  130.   BL %1
  131.  .ENDM
  132.  
  133.  .MACRO    GOcond 
  134.   B%1 %2
  135.  .ENDM
  136.  
  137.  .MACRO saveregister
  138.   .IF formulastackregistersave
  139.    .IF formulatempregistersave
  140.     STR tempregister,\tempregistersave
  141.    .ENDC
  142.    LD  tempregister,formulamystackregistersave
  143.    STR stackregister,[tempregister,#4]
  144.    MOV stackregister,tempregister
  145.   .ENDC
  146.   .IF formulaflagsave
  147.    MOV tempregister,R15
  148.    AND tempregister,tempregister,#0FC << 24.
  149.    STR tempregister,[stackregister,#8]
  150.   .ENDC
  151.   .IF formulatempregistersave 
  152.    .IF formulastackregistersave
  153.     LDR tempregister,\tempregistersave
  154.     GO \hupf
  155. \tempregistersave .WORD 0 
  156. \hupf
  157.    .ENDC
  158.    STR tempregister,[stackregister,#0]
  159.   .ENDC
  160.  .ENDM 
  161.  
  162.  .MACRO restoreregister
  163.   .IF formulaflagsave
  164.    LDR tempregister,[stackregister,#8]
  165.    TEQP R15,#0FC << 24. 
  166.    TEQP R15,tempregister 
  167.   .ENDC
  168.   .IF formulatempregistersave
  169.    LDR tempregister,[stackregister,#0]
  170.   .ENDC
  171.   .IF formulastackregistersave
  172.    LDR stackregister,[stackregister,#4]
  173.   .ENDC
  174.  .ENDM 
  175.  
  176.  .MACRO STACKadd
  177.   INTsum %1,%2,#%3
  178.   .IF formulastackregistersave
  179.    ST stackregister,formulamystackregistersave
  180.   .ENDC  
  181.  .ENDM
  182.  
  183.  .MACRO STACKsub
  184.   INTsubtract %1,%2,#%3
  185.   .IF formulastackregistersave
  186.    ST stackregister,formulamystackregistersave
  187.   .ENDC  
  188.  .ENDM
  189.  
  190.  .MACRO DEFSTORE 
  191. %1 .BLOCK %2,%3
  192.   .ALIGN
  193.  .ENDM 
  194.  
  195. ; division routine
  196. ; 1. calculate flag if result is negate and convert operands to positiv
  197. ; 2. second "divide" with unsigned suczessive Approximation  
  198. ; 3. fix the sign of result 
  199.  
  200.        .MACRO INTdivide_mac
  201.  
  202.   STR %2,\arg2save
  203.   STR %3,\arg3save
  204.  
  205.   MOV tempregister,#0
  206.   CMP %2,#0
  207.    RSBLT %2,%2,#0
  208.    SUBLT tempregister,tempregister,#1
  209.   CMP %3,#0
  210.    RSBLT %3,%3,#0
  211.    MVNLT tempregister,tempregister
  212.  STR tempregister,\sign 
  213.  
  214.   MOV  tempregister,#0
  215.  
  216.   ADDS %2,%2,%2
  217.   ADCS tempregister,tempregister,tempregister
  218.   CMP  tempregister,%3
  219.   SUBGE  tempregister,tempregister,%3
  220.   ADDGE  %2,%2,#1         
  221.  
  222.   ADDS %2,%2,%2
  223.   ADCS tempregister,tempregister,tempregister
  224.   CMP  tempregister,%3
  225.   SUBGE  tempregister,tempregister,%3
  226.   ADDGE  %2,%2,#1         
  227.  
  228.   ADDS %2,%2,%2
  229.   ADCS tempregister,tempregister,tempregister
  230.   CMP  tempregister,%3
  231.   SUBGE  tempregister,tempregister,%3
  232.   ADDGE  %2,%2,#1         
  233.  
  234.   ADDS %2,%2,%2
  235.   ADCS tempregister,tempregister,tempregister
  236.   CMP  tempregister,%3
  237.   SUBGE  tempregister,tempregister,%3
  238.   ADDGE  %2,%2,#1         
  239.  
  240.   ADDS %2,%2,%2
  241.   ADCS tempregister,tempregister,tempregister
  242.   CMP  tempregister,%3
  243.   SUBGE  tempregister,tempregister,%3
  244.   ADDGE  %2,%2,#1         
  245.  
  246.   ADDS %2,%2,%2
  247.   ADCS tempregister,tempregister,tempregister
  248.   CMP  tempregister,%3
  249.   SUBGE  tempregister,tempregister,%3
  250.   ADDGE  %2,%2,#1         
  251.  
  252.   ADDS %2,%2,%2
  253.   ADCS tempregister,tempregister,tempregister
  254.   CMP  tempregister,%3
  255.   SUBGE  tempregister,tempregister,%3
  256.   ADDGE  %2,%2,#1         
  257.  
  258.   ADDS %2,%2,%2
  259.   ADCS tempregister,tempregister,tempregister
  260.   CMP  tempregister,%3
  261.   SUBGE  tempregister,tempregister,%3
  262.   ADDGE  %2,%2,#1         
  263.  
  264.   ADDS %2,%2,%2
  265.   ADCS tempregister,tempregister,tempregister
  266.   CMP  tempregister,%3
  267.   SUBGE  tempregister,tempregister,%3
  268.   ADDGE  %2,%2,#1         
  269.  
  270.   ADDS %2,%2,%2
  271.   ADCS tempregister,tempregister,tempregister
  272.   CMP  tempregister,%3
  273.   SUBGE  tempregister,tempregister,%3
  274.   ADDGE  %2,%2,#1         
  275.  
  276.   ADDS %2,%2,%2
  277.   ADCS tempregister,tempregister,tempregister
  278.   CMP  tempregister,%3
  279.   SUBGE  tempregister,tempregister,%3
  280.   ADDGE  %2,%2,#1         
  281.  
  282.   ADDS %2,%2,%2
  283.   ADCS tempregister,tempregister,tempregister
  284.   CMP  tempregister,%3
  285.   SUBGE  tempregister,tempregister,%3
  286.   ADDGE  %2,%2,#1         
  287.  
  288.   ADDS %2,%2,%2
  289.   ADCS tempregister,tempregister,tempregister
  290.   CMP  tempregister,%3
  291.   SUBGE  tempregister,tempregister,%3
  292.   ADDGE  %2,%2,#1         
  293.  
  294.   ADDS %2,%2,%2
  295.   ADCS tempregister,tempregister,tempregister
  296.   CMP  tempregister,%3
  297.   SUBGE  tempregister,tempregister,%3
  298.   ADDGE  %2,%2,#1         
  299.  
  300.   ADDS %2,%2,%2
  301.   ADCS tempregister,tempregister,tempregister
  302.   CMP  tempregister,%3
  303.   SUBGE  tempregister,tempregister,%3
  304.   ADDGE  %2,%2,#1         
  305.  
  306.   ADDS %2,%2,%2
  307.   ADCS tempregister,tempregister,tempregister
  308.   CMP  tempregister,%3
  309.   SUBGE  tempregister,tempregister,%3
  310.   ADDGE  %2,%2,#1         
  311.  
  312.   ADDS %2,%2,%2
  313.   ADCS tempregister,tempregister,tempregister
  314.   CMP  tempregister,%3
  315.   SUBGE  tempregister,tempregister,%3
  316.   ADDGE  %2,%2,#1         
  317.  
  318.   ADDS %2,%2,%2
  319.   ADCS tempregister,tempregister,tempregister
  320.   CMP  tempregister,%3
  321.   SUBGE  tempregister,tempregister,%3
  322.   ADDGE  %2,%2,#1         
  323.  
  324.   ADDS %2,%2,%2
  325.   ADCS tempregister,tempregister,tempregister
  326.   CMP  tempregister,%3
  327.   SUBGE  tempregister,tempregister,%3
  328.   ADDGE  %2,%2,#1         
  329.  
  330.   ADDS %2,%2,%2
  331.   ADCS tempregister,tempregister,tempregister
  332.   CMP  tempregister,%3
  333.   SUBGE  tempregister,tempregister,%3
  334.   ADDGE  %2,%2,#1         
  335.  
  336.   ADDS %2,%2,%2
  337.   ADCS tempregister,tempregister,tempregister
  338.   CMP  tempregister,%3
  339.   SUBGE  tempregister,tempregister,%3
  340.   ADDGE  %2,%2,#1         
  341.  
  342.   ADDS %2,%2,%2
  343.   ADCS tempregister,tempregister,tempregister
  344.   CMP  tempregister,%3
  345.   SUBGE  tempregister,tempregister,%3
  346.   ADDGE  %2,%2,#1         
  347.  
  348.   ADDS %2,%2,%2
  349.   ADCS tempregister,tempregister,tempregister
  350.   CMP  tempregister,%3
  351.   SUBGE  tempregister,tempregister,%3
  352.   ADDGE  %2,%2,#1         
  353.  
  354.   ADDS %2,%2,%2
  355.   ADCS tempregister,tempregister,tempregister
  356.   CMP  tempregister,%3
  357.   SUBGE  tempregister,tempregister,%3
  358.   ADDGE  %2,%2,#1         
  359.  
  360.   ADDS %2,%2,%2
  361.   ADCS tempregister,tempregister,tempregister
  362.   CMP  tempregister,%3
  363.   SUBGE  tempregister,tempregister,%3
  364.   ADDGE  %2,%2,#1         
  365.  
  366.   ADDS %2,%2,%2
  367.   ADCS tempregister,tempregister,tempregister
  368.   CMP  tempregister,%3
  369.   SUBGE  tempregister,tempregister,%3
  370.   ADDGE  %2,%2,#1         
  371.  
  372.   ADDS %2,%2,%2
  373.   ADCS tempregister,tempregister,tempregister
  374.   CMP  tempregister,%3
  375.   SUBGE  tempregister,tempregister,%3
  376.   ADDGE  %2,%2,#1         
  377.  
  378.   ADDS %2,%2,%2
  379.   ADCS tempregister,tempregister,tempregister
  380.   CMP  tempregister,%3
  381.   SUBGE  tempregister,tempregister,%3
  382.   ADDGE  %2,%2,#1         
  383.  
  384.   ADDS %2,%2,%2
  385.   ADCS tempregister,tempregister,tempregister
  386.   CMP  tempregister,%3
  387.   SUBGE  tempregister,tempregister,%3
  388.   ADDGE  %2,%2,#1         
  389.  
  390.   ADDS %2,%2,%2
  391.   ADCS tempregister,tempregister,tempregister
  392.   CMP  tempregister,%3
  393.   SUBGE  tempregister,tempregister,%3
  394.   ADDGE  %2,%2,#1         
  395.  
  396.   ADDS %2,%2,%2
  397.   ADCS tempregister,tempregister,tempregister
  398.   CMP  tempregister,%3
  399.   SUBGE  tempregister,tempregister,%3
  400.   ADDGE  %2,%2,#1         
  401.  
  402.   ADDS %2,%2,%2
  403.   ADCS tempregister,tempregister,tempregister
  404.   CMP  tempregister,%3
  405.   SUBGE  tempregister,tempregister,%3
  406.   ADDGE  %2,%2,#1         
  407.    
  408.   LDR tempregister,\sign 
  409.   CMP tempregister,#0
  410.   RSBNE %2,%2,#0 
  411.   MOV tempregister,%2
  412.   LDR %2,\arg2save
  413.   LDR %3,\arg3save
  414.   MOV %1,tempregister
  415.  
  416.  GO \hupf
  417. \arg2save .WORD 0
  418. \arg3save .WORD 0
  419. \sign     .WORD 0
  420. \hupf
  421.  
  422.  .ENDM 
  423.  
  424.  .MACRO INTconstlongload
  425.   LDR %1,\temp
  426.   GO \jump2
  427. \temp .WORD %2
  428. \jump2 
  429.  .ENDM
  430.  
  431.  .MACRO INTconstload 
  432.   .IF 100<%2
  433.     INTconstlongload %1,%2
  434.   .ELSE
  435.    .IF 0>%2
  436.     INTconstlongload %1,%2
  437.    .ELSE
  438.     MOV %1,#%2
  439.    .ENDC
  440.   .ENDC
  441.  .ENDM
  442.   
  443.  .MACRO INTsum
  444.   ADD %1,%2,%3
  445.  .ENDM
  446.  
  447.  .MACRO INTsubtract
  448.   SUB %1,%2,%3
  449.  .ENDM
  450.   
  451.  .MACRO INTconstmult
  452.   .IF %2<>1 
  453.    .IF %2=4
  454.     MOV %1,%1,ASL #2  
  455.    .ELSE
  456.     MOV tempregister,%1
  457.     MUL %1,tempregister,#%2
  458.    .ENDC
  459.   .ENDC 
  460.  .ENDM
  461.  
  462.  .MACRO INTmodulo
  463.   STR %2,\temp2
  464.   STR %3,\temp3
  465.   INTdivide_mac %1,%2,%3
  466.   MOV tempregister,%1
  467.   LDR %2,\temp2
  468.   LDR %3,\temp3
  469.   MUL tempregister,%3,tempregister
  470.   SUB %1,%2,tempregister
  471.   B \ready
  472. \temp2 .WORD 0
  473. \temp3 .WORD 0
  474. \ready
  475.  .ENDM
  476.  
  477.  .MACRO INTregstore
  478.   MOV %1,%2
  479.  .ENDM
  480.  
  481.  .MACRO INTarraystore
  482.   STR %2,[%1]
  483.  .ENDM
  484.   
  485.  .MACRO INTarrayload
  486.   LDR %2,[%1]
  487.  .ENDM
  488.    
  489.  .MACRO INTgreater 
  490.   CMP %2,%3
  491.   MOVGT %1,#1
  492.   MOVLE %1,#0
  493.  .ENDM
  494.  
  495.  .MACRO INTless 
  496.   CMP %2,%3
  497.   MOVLT %1,#1
  498.   MOVGE %1,#0
  499.  .ENDM
  500.   
  501.  .MACRO INTstackload 
  502.   LDR %1,%2,%3
  503.  .ENDM
  504.  
  505.  .MACRO INTstackstore 
  506.   STR %3,%1,%2
  507.  .ENDM
  508.  
  509.  .MACRO STRINGconstload 
  510.   GO \hupf
  511. \adress .STRING %2
  512.  .ALIGN
  513.  .WORD 0
  514. \hupf
  515.   ADR %1,\adress
  516.  .ENDM
  517.   
  518.  .MACRO INTPTRconstload
  519.   ADDR %1,%2
  520.  .ENDM
  521.  
  522.  .MACRO INTPTRstackload 
  523.   LDR %1,%2,%3
  524.  .ENDM
  525.  
  526.  .MACRO INTPTRstackstore 
  527.   STR %3,%1,%2
  528.  .ENDM
  529.  
  530.  .MACRO CHARPTRstackstore 
  531.   STR %3,%1,%2
  532.  .ENDM  
  533.  
  534.  .MACRO ifnotgoto 
  535.   CMP %2,#0
  536.   GOcond EQ,%1
  537.  .ENDM
  538.    
  539.  .MACRO goto
  540.   GO %1
  541.  .ENDM
  542.  
  543.  .ALIGN
  544.  .LIST
  545.  
  546. ;routines to check errors after a SWI via the V-flag
  547.  
  548.  B formulafunctionstart
  549. errorcheckflag .EQU TRUE
  550.  
  551. ;    error, if errorflag==1
  552. ; no error, if errorflag==0
  553. ; DECLARE INT errorflag
  554. errorflag     .WORD 0 
  555. ; RiscOS errorblock
  556. ; DECLARE CHARPTR errorblock
  557. errorblock    .WORD 0
  558.  
  559. formulaerrorcheck
  560.    BVS formulaerror
  561.    MOV tempregister,#0
  562.    STR tempregister,errorflag
  563.    B   formulaerrorback
  564. formulaerror
  565.    STR R0,errorblock
  566.    MOV tempregister,#1
  567.    STR tempregister,errorflag
  568. formulaerrorback
  569.    MOV PC,R14
  570.    MOV R0,R0
  571. formulafunctionstart
  572.  
  573.  
  574.  .MACRO errorcheck
  575.   .IF errorcheckflag
  576.    STR R14,\temp
  577.    BL formulaerrorcheck
  578.    LDR R14,\temp
  579.    B \ready
  580. \temp .WORD 0
  581. \ready
  582.   .ENDC
  583.  .ENDM  
  584.  
  585.  .MACRO perror
  586.   LD  tempregister,errorflag
  587.   CMP tempregister,#1
  588.   BNE \ready
  589.   STR R0,\formulatemp0  
  590.   LD  R0,errorblock
  591.   ADD R0,R0,#4
  592.   SWI XOS_Write0
  593.   SWI XOS_NewLine
  594.   LDR  R0,\formulatemp0
  595.   B \ready
  596. \formulatemp0
  597. \ready
  598.  .ENDM
  599.  
  600. ;Macro to convert integer %2 to string %1 destroy R0,R1,R2,R3,R4
  601.  
  602. .MACRO int2stringmacro
  603.   GO \hupf
  604. \buffer .BLOCK 12.
  605.  .ALIGN
  606. \hupf
  607.   ADR R4,\buffer
  608.   MOV R2,#11. 
  609.   MOV R0,%2
  610.   MOV R1,R4
  611.   SWI XOS_BinaryToDecimal
  612.   errorcheck
  613.   MOV R3,#0
  614.   STRB R3,[R4,R2]
  615.   MOV %1,R4
  616. .ENDM
  617.  
  618. ; DECLARE INT  writeint(INT number)
  619.  
  620.  .MACRO writeint
  621.   LDR R5,[stackregister,#%2]
  622.   int2stringmacro R0,R5
  623.   SWI XOS_Write0
  624. ;  errorcheck
  625.  .ENDM 
  626.  
  627. ; DECLARE INT  system(CHARPTR cli_string)
  628.  
  629.  .MACRO system
  630.   LDR R0,[stackregister,#%2]
  631.   SWI XOS_CLI
  632.   errorcheck
  633.  .ENDM
  634.  
  635. ; DECLARE INT  cr()
  636.  
  637.  .MACRO cr
  638.   SWI XOS_NewLine
  639. ;  errorcheck
  640.  .ENDM 
  641.  
  642.